/**
 * 使用 Fetch API 导出聊天交互记录
 *
 * 该函数会收集聊天记录数据，将其转换为 JSON 格式，
 *
 * 创建一个 Blob 对象，然后调用 `saveFileWithFetch` 函数保存文件。
 *
 * @param {string} chatName - 聊天名称，用于生成文件名。若为空，则使用当前时间作为标识。
 *
 * @returns {Promise<{success: boolean}>} - 一个 Promise，成功时返回包含 `{ success: true }` 的对象。
 *
 * @throws {Error} - 当导出过程中出现错误时抛出错误。
 */
async function exportChatInteractionWithFetch(chatName) {
	try {
		// 检查聊天记录是否为空
		if (conversationHistory.length === 0) throw Error("聊天记录为空");
		/**
		 * 构建聊天记录数据对象，包含元数据和聊天历史记录
		 */
		const chatData = {
			// 元数据，记录导出时间和版本号
			meta: {
				exportedAt: getSystemTime(),
				version: "2025-08-30"
			},
			// 聊天历史记录
			history: conversationHistory
		};
		/**
		 * 将聊天记录数据对象转换为格式化的 JSON 字符串，使用制表符进行缩进
		 */
		const jsonString = JSON.stringify(chatData, null, '\t');
		/**
		 * 创建一个 MIME 类型为 application/json 的 Blob 对象
		 */
		const blob = new Blob([jsonString], { type: "application/json" });
		/**
		 * 获取系统时间，用于生成文件路径
		 */
		const datePath = getSystemTime(false);
		/**
		 * 生成文件路径，包含日期和时间，用于保存文件
		 */
		const filePath = `historys/${datePath}/`
		/**
		 * 生成文件名，包含聊天名称或当前时间
		 */
		const fileName = chatName ? `${filePath}${chatName}.json` : `${filePath}${getSystemTime()}.json`;
		// 调用 saveFileWithFetch 函数保存文件
		await saveFileWithFetch(blob, fileName, true);
		// 返回导出成功的结果
		return { success: true };
	}
	catch (error) {
		// 捕获异常并显示错误信息
		showSystemMessage(`${error.name} | ${error.message} | ${error.stack}`, "error");
		// 抛出捕获的错误，以便上层调用者处理
		throw error;
	}
};

/**
 * 处理聊天记录导入的事件函数
 *
 * 该函数会创建一个隐藏的文件输入元素，让用户选择 JSON 文件，
 *
 * 当用户选择文件后，调用加载聊天记录的函数处理所选文件
 */
function importChatInteractionEvent() {
	/**
	 * 创建一个文件输入元素，用于选择要导入的文件
	 */
	const input = document.createElement('input');
	// 设置输入元素的类型为文件选择
	input.type = 'file';
	// 设置允许选择的文件扩展名，仅允许 JSON 文件
	input.accept = '.json';
	// 监听文件输入元素的变化事件
	input.onchange = function (event) {
		/**
		 * 获取用户选择的第一个文件
		 */
		const file = event.target.files[0];
		/**
		 * 创建一个 FileReader 实例，用于读取文件内容
		 */
		const reader = new FileReader();
		// 若用户选择了文件，则调用加载聊天记录的函数处理该文件
		if (!file) return;
		reader.onload = event => {
			/**
			 * 解析文件内容为 JSON 格式
			 */
			const jsonData = JSON.parse(event.target.result);
			// 验证解析后的 JSON 数据是否有效
			if (jsonData) loadChatHistory(jsonData);
		};
		// 以文本格式读取指定的文件
		reader.readAsText(file);
	};
	// 触发文件选择对话框
	input.click();
};

/**
 * 加载聊天记录到当前会话中
 *
 * 该函数接收一个包含聊天记录的 JSON 数据，验证其格式有效性后，
 *
 * 将聊天记录更新到当前会话，并重新渲染所有聊天消息。
 *
 * 若过程中出现错误，会在控制台输出错误信息，并给用户显示错误提示。
 *
 * @param {Object} jsonData - 包含聊天记录的 JSON 对象，预期包含 `history` 数组
 *
 * @throws {Error} - 当聊天记录格式无效时抛出错误
 */
function loadChatHistory(jsonData) {
	try {
		// 验证聊天记录格式是否有效，若无效则抛出错误
		if (!jsonData.history || !Array.isArray(jsonData.history)) throw new Error("无效的聊天记录格式");
		// 更新当前的聊天记录，将传入的历史记录赋值给全局的会话历史变量
		conversationHistory = jsonData.history;
		// 重新渲染所有聊天消息，将更新后的聊天记录显示在界面上
		renderAllMessages(chatHistoryPanel);
		// 显示系统状态提示，通知用户聊天记录导入成功
		showSystemMessage("聊天记录导入成功！", "success");
		// 配置面板选项设置为任意值，用于后续操作
		configurePanelOption = 'any';
		// 隐藏配置面板
		eraseAllConfigurePanel()
		// 显示聊天记录容器面板
		chatHistoryContainerPanel.style.display = "flex";
	}
	catch (error) {
		// 捕获异常并显示错误信息
		showSystemMessage(`${error.name} | ${error.message} | ${error.stack}`, "error");
	}
};